package uniandes.asoft.experimento1.cliente.negocio;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.SwingUtilities;

import uniandes.asoft.experimento1.cliente.principal.VehiculoPrincipal;

public class Vehiculo extends Thread {

	private Socket conexion;
	private ObjectInputStream entrada;
	private ObjectOutputStream salida;
	private String nombreServidor;
	private int puerto;
	private VehiculoPrincipal vehiculoPrincipal;

	public Vehiculo(VehiculoPrincipal vehiculoPrincipal, String nombreServidor,
			int puerto) throws UnknownHostException, IOException {

		this.nombreServidor = nombreServidor;
		this.puerto = puerto;

		this.conexion = new Socket(InetAddress.getByName(this.nombreServidor),
				this.puerto);

		this.vehiculoPrincipal = vehiculoPrincipal;

		mostrarMensaje("VEHICULO Conectado a: "
				+ conexion.getInetAddress().getHostName());

		try {
			obtenerFlujos();
		} catch (IOException e) {

			cerrarConexion();

		}

	}

	private void obtenerFlujos() throws IOException {

		salida = new ObjectOutputStream(conexion.getOutputStream());
		salida.flush();

		entrada = new ObjectInputStream(conexion.getInputStream());

		mostrarMensaje("\n Se recibideron los flujos de E/S \n");

	}

	public void enviarDatos(String mensaje) {

		try {
			salida.writeObject("CLIENTE >>> " + mensaje);
			salida.flush();
			mostrarMensaje("\nCLIENTE>>> " + mensaje);

		} catch (IOException e) {
			cerrarConexion();
			System.out.print("Excepcion enviarDatos(): " + e.toString());
		}

	}

	private void cerrarConexion() {

		System.out.print("\nFinalizando la conexion\n");

		try {
			salida.close();
			entrada.close();
			conexion.close();
		} catch (IOException e) {

			System.out.print("Excepcion cerrarConexion(): " + e.toString());
		}

	}

	private void mostrarMensaje(final String mensajeAMostrar) {

		SwingUtilities.invokeLater(new Runnable() {

			public void run() {

				vehiculoPrincipal.areaPantalla.append(mensajeAMostrar);
				vehiculoPrincipal.areaPantalla
						.setCaretPosition(vehiculoPrincipal.areaPantalla
								.getText().length());

			}
		});

	}

	public void run() {

		while (true) {

			try {
				Thread.sleep(1000);
				enviarDatos("01011203021930291");

			} catch (InterruptedException e) {

				e.printStackTrace();
			}

		}

	}

}
